package org.posupe.areas;

/**
 * @author Claudemir Junior
 * 
 */
public class RepositorioAreasLista implements RepositorioAreas {
	private Area area;

	private RepositorioAreasLista proximo;

	private int tamanho;

	public RepositorioAreasLista () {
		this.area = null;
		this.proximo = null;
		this.tamanho = 0;
	}
	
	public void inserir(Area area) {
		if (this.area == null) {
			this.area = area;
			this.proximo = new RepositorioAreasLista();
		} else {
			this.proximo.inserir(area);
		}

		this.tamanho = this.tamanho + 1;
	}

	public void atualizar(Area area) throws AreaInexistenteException {
		if (this.area != null) {
			if (this.area.getCodigo() == area.getCodigo()) {
				this.area = area;
			} else {
				this.proximo.atualizar(area);
			}
		} else {
			throw new AreaInexistenteException(area.getCodigo());
		}
	}

	public void remover(int codigo) throws AreaInexistenteException {
		if (this.area != null) {
			if (this.area.getCodigo() == codigo) {
				this.area = this.proximo.area;
				this.proximo = this.proximo.proximo;
			} else {
				this.proximo.remover(codigo);
			}

			this.tamanho = this.tamanho - 1;
		} else {
			throw new AreaInexistenteException(codigo);
		}
	}

	public Area procurar(int codigo) throws AreaInexistenteException {
		Area resultado = null;

		if (this.area != null) {
			if (this.area.getCodigo() == codigo) {
				resultado = this.area;
			} else {
				resultado = this.proximo.procurar(codigo);
			}
		} else {
			throw new AreaInexistenteException(codigo);
		}

		return resultado;
	}

	public boolean existe(int codigo) {
		boolean resultado = false;

		if (this.area != null) {
			if (this.area.getCodigo() == codigo) {
				resultado = true;
			} else {
				resultado = this.proximo.existe(codigo);
			}
		}

		return resultado;
	}

	public IteratorAreas procurar(Area area) {
		IteratorAreasArrayList resultado = new IteratorAreasArrayList();
		IteratorAreas areas = this.getIterator();
		
		while (areas.hasNext()) {
			Area nextArea = areas.next();
			if (area.match(nextArea)) {
				resultado.add(nextArea);
			}
		}

		return resultado;
	}

	public IteratorAreas getIterator() {
		IteratorAreasArrayList resultado = new IteratorAreasArrayList();
		RepositorioAreasLista proximaArea = this;
		int contador = 0;

		while (contador < this.tamanho) {
			resultado.add(proximaArea.area);
			proximaArea = proximaArea.proximo;
			contador++;
		}

		return resultado;
	}

}
